
// 每根筷子对应一个信号量，每个信号量的初始值为 1
// 每个信号量可以控制哲学家互斥访问对应的筷子
semaphore chopstick[5];
void init() {
    for (int i = 0; i < 5; i++) 
        chopstick[i] = 1;
}

semaphore mutex = 1; // 保证每个哲学家获取两根筷子的原子性

// 哲学家 i 的活动过程
void philosopher(int i) {

    while (true) {
        thinking();  // 思考

        wait(mutex); // 保证一次性拿到两根筷子
        wait(chopstick[i]); // 获得左边的筷子
        wait(chopstick[(i + 1) % 5]); // 获得右边的筷子
        signal(mutex); // 拿到了两根筷子，通知其他哲学家拿筷子

        eating();   // 就餐
        signal(chopstick[i]); // 释放左边的筷子
        signal(chopstick[(i + 1) % 5]); // 释放右边的筷子
    }

}

